Skip to content

docs(assets): unify display_name helper docstrings + fixture tests (FE-747)#12399

Open
dante01yoon wants to merge 9 commits into
mainfrom
jaewon/fe-747-l3-fe-migrate-assetmetadatautilsts-helpers-to-unified-asset
Open

docs(assets): unify display_name helper docstrings + fixture tests (FE-747)#12399
dante01yoon wants to merge 9 commits into
mainfrom
jaewon/fe-747-l3-fe-migrate-assetmetadatautilsts-helpers-to-unified-asset

Conversation

@dante01yoon

@dante01yoon dante01yoon commented May 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

Originally bundled FE-747 + FE-748. After merging latest main, FE-748 is obsolete (see below) and nothing of it remains, so this PR is now FE-747 only: the assetMetadataUtils display helpers are documented against the unified BE-808 asset shape, backed by Cloud/OSS fixture tests. No production behavior change — only docstrings and tests; the helper bodies are byte-identical to main.

Why FE-748 is obsolete

FE-748 migrated getMediaDisplayName in src/platform/missingMedia/composables/useMissingMediaInteractions.ts onto the unified display_name. Upstream PR #12705 ("Simplify missing media error presentation") then removed the entire missing-media library/upload flow, deleting that composable along with MissingMediaRow.vue and MissingMediaLibrarySelect.vue. getMediaDisplayName / getLibraryOptions now have zero consumers anywhere in src/ — the missing-media error tab no longer resolves asset display names at all; it renders a flat {nodeName} - {inputName} list. FE-748 has no surface left to land on. The merge conflict was resolved by accepting the upstream deletion and removing the orphaned spec; FE-748 is closed as superseded.

Changes (FE-747)

src/platform/assets/utils/assetMetadataUtils.ts

  • Reframe the getAssetDisplayFilename / getAssetCardTitle docstrings: display_name is the unified user-facing label per the BE-808 Asset Identity RFC, not a "Cloud-only / queue-output mapper" field. No code change — the helpers already consume display_name through the existing fallback chain. The merge also preserved getAssetStoredFilename (added on main).

src/platform/assets/utils/assetMetadataUtils.test.ts

  • Add unified-shape fixtures — Cloud (asset.name = hash, display_name = filename) and OSS (asset.name = filename, nullable display_name) — asserting both helpers render the same label, plus display_name precedence cases.

Verification — 2026-06-17 (CDP, OSS + Cloud)

Dynamic-imported the merged module and ran the helpers against real data in both environments:

  • OSS — local Core (--enable-assets) behind the dev server: real input assets (04_toolbox.png, image64x64.webp, …) resolve to their friendly filename; the Imported-tab cards render filenames, never hashes.
  • Cloud — authenticated cloud.comfy.org session, real /api/assets: correct labels for input / output / models. Key case — an output asset whose hash is a content hash (183f9635….mp4) resolves to its display_name (video/ComfyUI-vid_3_00001_.mp4), no hash leak. Models resolve via user_metadata.filename; the card title uses the curated metadata.name (pre-existing behavior).
  • Precedenceuser_metadata.filename → metadata.filename → display_name → asset.name confirmed.
  • Current Cloud now populates display_name (BE-1043 has landed), so the fallback chain is live, not dormant. No regression in either environment.

pnpm typecheck, eslint, the 59 assetMetadataUtils.test.ts cases, and full CI (incl. cloud Playwright) pass.

Refs

…, FE-748)

FE-748: drop the isCloud branch in getMediaDisplayName. Resolve through
the shared getAssetDisplayFilename helper so the missingMedia surface
uses the same fallback chain (user_metadata.filename ->
metadata.filename -> display_name -> asset.name) as the asset card and
browser surfaces.

FE-747: align assetMetadataUtils helper docstrings with the unified
display_name shape emitted by both Core and Cloud per the BE-808 Asset
Identity RFC. Add fixture tests covering the Cloud (hash + display_name)
and OSS (filename + nullable display_name) response shapes.
@coderabbitai

coderabbitai Bot commented May 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Clarifies asset display helper docs, adds tests ensuring Cloud and OSS assets produce consistent UI labels (including OSS display_name overrides), and refactors missing-media name resolution to use filename-indexed asset lookups with accompanying tests for precedence and library option mapping.

Changes

Unified Asset Identity Implementation

Layer / File(s) Summary
Asset display helpers docs & tests
src/platform/assets/utils/assetMetadataUtils.ts, src/platform/assets/utils/assetMetadataUtils.test.ts
JSDoc for getAssetDisplayFilename and getAssetCardTitle updated to document the human-readable fallback chain and hash-keyed asset wording. New tests validate Cloud vs OSS asset shapes yield the same user-facing label and honor OSS display_name overrides.
Media display name unified resolution
src/platform/missingMedia/composables/useMissingMediaInteractions.ts, src/platform/missingMedia/composables/useMissingMediaInteractions.test.ts
Imports updated to use getAssetDisplayFilename and inputAssetsByFilename; removed isCloud. getMediaDisplayName now resolves names via useAssetsStore().inputAssetsByFilename and returns the asset label or the raw input when unmatched. Tests cover display-name precedence, metadata filename preference, and getLibraryOptions mapping/filtering.

Sequence Diagram

sequenceDiagram
  participant Caller
  participant getMediaDisplayName
  participant useAssetsStore
  participant inputAssetsByFilename
  participant getAssetDisplayFilename
  
  Caller->>getMediaDisplayName: call(name)
  getMediaDisplayName->>useAssetsStore: get store instance
  useAssetsStore-->>getMediaDisplayName: store reference
  getMediaDisplayName->>inputAssetsByFilename: lookup(name)
  alt Asset found
    inputAssetsByFilename-->>getMediaDisplayName: asset
    getMediaDisplayName->>getAssetDisplayFilename: getAssetDisplayFilename(asset)
    getAssetDisplayFilename-->>getMediaDisplayName: display label
    getMediaDisplayName-->>Caller: return label
  else Asset not found
    inputAssetsByFilename-->>getMediaDisplayName: undefined
    getMediaDisplayName-->>Caller: return raw name
  end
Loading

Estimated Code Review Effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested Labels

size:M, core/1.44, cloud/1.44

Suggested Reviewers

  • DrJKL

Poem

🐰 I hopped through code with nimble paws,
Cloud and OSS now wear the same laws,
Filenames chosen, hashes aligned,
Tests ensure no label left behind,
A rabbit cheers this tidy find.

🚥 Pre-merge checks | ✅ 7
✅ Passed checks (7 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
End-To-End Regression Coverage For Fixes ✅ Passed PR title uses "refactor" (not bug-fix language like fix/fixed/bugfix). First condition of failure criteria not met, so check passes.
Adr Compliance For Entity/Litegraph Changes ✅ Passed ADR check does not apply: no changed files are under src/lib/litegraph/, src/ecs/, or related to graph entities. PR modifies only asset metadata and missing media composables in src/platform/.
Title check ✅ Passed Title clearly identifies the main change: unified documentation and fixture tests for asset display helpers per FE-747. Accurately summarizes the focus on docstrings and tests.
Description check ✅ Passed Description comprehensively covers Summary, Changes, and verification details. Exceeds template requirements with technical context (FE-748 obsolescence, fallback chain precedence, production behavior verification across OSS/Cloud environments).

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch jaewon/fe-747-l3-fe-migrate-assetmetadatautilsts-helpers-to-unified-asset

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
src/platform/missingMedia/composables/useMissingMediaInteractions.test.ts (1)

6-12: ⚡ Quick win

Avoid module-level mutable mock state; switch to a hoisted mock container.

Using a shared mutable Map at module scope makes isolation fragile as this suite grows. Prefer a vi.hoisted state object for the mocked store source of truth.

Proposed refactor
-const mockInputAssetsByFilename = new Map<string, AssetItem>()
+const mockedAssetsState = vi.hoisted(() => ({
+  inputAssetsByFilename: new Map<string, AssetItem>()
+}))

 vi.mock('`@/stores/assetsStore`', () => ({
   useAssetsStore: () => ({
-    inputAssetsByFilename: mockInputAssetsByFilename
+    inputAssetsByFilename: mockedAssetsState.inputAssetsByFilename
   })
 }))

 describe('getMediaDisplayName', () => {
   beforeEach(() => {
-    mockInputAssetsByFilename.clear()
+    mockedAssetsState.inputAssetsByFilename.clear()
   })
@@
-    mockInputAssetsByFilename.set(hash, {
+    mockedAssetsState.inputAssetsByFilename.set(hash, {
@@
-    mockInputAssetsByFilename.set(hash, {
+    mockedAssetsState.inputAssetsByFilename.set(hash, {
@@
-    mockInputAssetsByFilename.set(hash, {
+    mockedAssetsState.inputAssetsByFilename.set(hash, {
@@
-    mockInputAssetsByFilename.set(hash, {
+    mockedAssetsState.inputAssetsByFilename.set(hash, {

As per coding guidelines: "Keep module mocks contained; do not use global mutable state within test files; use vi.hoisted() if necessary."

Also applies to: 22-24

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/platform/missingMedia/composables/useMissingMediaInteractions.test.ts`
around lines 6 - 12, Replace the module-scoped mutable Map
mockInputAssetsByFilename with a hoisted mock container: create a vi.hoisted(()
=> ({ inputAssetsByFilename: new Map<string, AssetItem>() })) object and have
the mocked useAssetsStore return that container's inputAssetsByFilename instead
of the top-level Map; update any tests that mutate mockInputAssetsByFilename to
mutate the hoisted container (referencing mockInputAssetsByFilename and
useAssetsStore in the diff) so each test file run gets isolated, resettable
state.
src/platform/assets/utils/assetMetadataUtils.test.ts (1)

388-389: ⚡ Quick win

Remove redundant inline comments in the new test block.

These comments restate what test names and fixture identifiers already convey; please drop them to match repo guidance on minimizing code comments.

As per coding guidelines: "Avoid new usage of code comments; do not add or retain redundant comments."

Also applies to: 398-399

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/platform/assets/utils/assetMetadataUtils.test.ts` around lines 388 - 389,
Remove the redundant inline comments that restate already-clear test names and
fixture identifiers — specifically delete the comment text about "Cloud asset:
`asset.name` is a content hash; `display_name` carries the user-facing label."
(and the similar redundant comments at the other test lines) from the new test
block in assetMetadataUtils.test; leave the tests and fixtures unchanged, only
remove those comment lines so the tests conform to the "no redundant comments"
guideline.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/platform/assets/utils/assetMetadataUtils.test.ts`:
- Around line 388-389: Remove the redundant inline comments that restate
already-clear test names and fixture identifiers — specifically delete the
comment text about "Cloud asset: `asset.name` is a content hash; `display_name`
carries the user-facing label." (and the similar redundant comments at the other
test lines) from the new test block in assetMetadataUtils.test; leave the tests
and fixtures unchanged, only remove those comment lines so the tests conform to
the "no redundant comments" guideline.

In `@src/platform/missingMedia/composables/useMissingMediaInteractions.test.ts`:
- Around line 6-12: Replace the module-scoped mutable Map
mockInputAssetsByFilename with a hoisted mock container: create a vi.hoisted(()
=> ({ inputAssetsByFilename: new Map<string, AssetItem>() })) object and have
the mocked useAssetsStore return that container's inputAssetsByFilename instead
of the top-level Map; update any tests that mutate mockInputAssetsByFilename to
mutate the hoisted container (referencing mockInputAssetsByFilename and
useAssetsStore in the diff) so each test file run gets isolated, resettable
state.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4212abbd-b8eb-4827-b0ca-a9f88a461604

📥 Commits

Reviewing files that changed from the base of the PR and between f1f65cf and 2184d25.

📒 Files selected for processing (4)
  • src/platform/assets/utils/assetMetadataUtils.test.ts
  • src/platform/assets/utils/assetMetadataUtils.ts
  • src/platform/missingMedia/composables/useMissingMediaInteractions.test.ts
  • src/platform/missingMedia/composables/useMissingMediaInteractions.ts

coderabbitai[bot]
coderabbitai Bot previously approved these changes May 21, 2026
…DisplayName

Adds 4 cases against the in-file consumer of getMediaDisplayName that was
previously untested: empty-on-missing-widget, Cloud-hash combo values
mapped through the shared helper chain (display_name and
metadata.filename), OSS filename pass-through, and the candidate-name
filter. Caught by the FE-747/748 PR review pass.
@codecov

codecov Bot commented May 21, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

@@             Coverage Diff             @@
##             main   #12399       +/-   ##
===========================================
- Coverage   77.42%   64.67%   -12.75%     
===========================================
  Files        1629     1514      -115     
  Lines      111798    77156    -34642     
  Branches    36754    21779    -14975     
===========================================
- Hits        86559    49904    -36655     
- Misses      24373    26916     +2543     
+ Partials      866      336      -530     
Flag Coverage Δ
e2e ?
unit 64.67% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/platform/assets/utils/assetMetadataUtils.ts 98.76% <ø> (+19.85%) ⬆️

... and 1190 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

coderabbitai[bot]
coderabbitai Bot previously approved these changes May 21, 2026
coderabbitai[bot]
coderabbitai Bot previously approved these changes May 21, 2026
@dante01yoon dante01yoon marked this pull request as ready for review May 22, 2026 02:30
@dante01yoon dante01yoon requested a review from a team May 22, 2026 02:30
@dosubot dosubot Bot added the size:S This PR changes 10-29 lines, ignoring generated files. label May 22, 2026
dante01yoon added a commit that referenced this pull request May 22, 2026
# Conflicts:
#	src/platform/assets/utils/assetMetadataUtils.test.ts
#	src/platform/assets/utils/assetMetadataUtils.ts
DrJKL
DrJKL previously approved these changes May 25, 2026

@DrJKL DrJKL left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sunsets really are beautiful, aren't they?

LGTM — single-source-of-truth move onto getAssetDisplayFilename is the right call, the BE-808 cloud/OSS parity tests read cleanly, and the integration test for getLibraryOptions gives real behavioural coverage. A handful of nits below, none blocking.

if (!isCloud) return name
return useAssetsStore().getInputName(name)
const asset = useAssetsStore().inputAssetsByFilename.get(name)
return asset ? getAssetDisplayFilename(asset) : name

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Subtle behavioural drift worth flagging in the PR description: the old getInputName(name) path returned asset.name (always the raw asset name). The new getAssetDisplayFilename chain prefers user_metadata.filenamemetadata.filenamedisplay_nameasset.name. For Cloud workflows that means the missing-media row and pending-selection label in MissingMediaRow.vue will now surface whatever the queue mapper put into display_name instead of the hash-y asset.name. Almost certainly desired per BE-808, just worth confirming both MissingMediaRow call sites are happy with the richer fallback.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Confirmed and intended per BE-808. Both MissingMediaRow.vue call sites are happy with the richer fallback — see PR description §1/§2 (live setupState dump) for the per-layer verification. The drift is documented in the Review Focus + Verification sections. No production-visible change today since current Cloud assets have display_name=null (§6); the new layers activate once BE-1043 starts populating it.

* Human-readable filename for UI labels.
* Fallback: user_metadata.filename → metadata.filename → display_name → asset.name.
* For serialized identifiers use {@link getAssetFilename}.
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: the trimmed docstring loses the useful "queue output mappers in Cloud populate display_name" context. Since useMissingMediaInteractions.getMediaDisplayName now relies on that contract, consider keeping one short sentence about who populates display_name.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Intentionally left as-is. The empirical Cloud probe (PR description §6) showed display_name is null across all sampled Cloud assets and asset.name is already a friendly filename — so the "queue output mappers populate display_name" framing is not current production behaviour and was deliberately dropped to avoid a misleading docstring. Per the BE-808 RFC display_name is the unified field both backends emit once BE-1043/1044 land; the docstring reflects that contract rather than naming a specific (currently inaccurate) populator.


it('honours OSS-emitted display_name when present', () => {
const ossWithDisplayName: AssetItem = {
...ossShape,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: name: 'sunset.png' is already inherited from ...ossShape — the explicit re-assignment is a no-op and slightly muddies what the test is varying (the display_name field). Safe to drop.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done — dropped the redundant re-assignment; the fixture now only varies display_name.

useMissingMediaInteractions
} from '@/platform/missingMedia/composables/useMissingMediaInteractions'

const mockInputAssetsByFilename = new Map<string, AssetItem>()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: module-level mutable mockInputAssetsByFilename is the "global mutable state in test file" pattern the unit-testing guide steers away from. clear() in beforeEach makes it safe in practice, but vi.hoisted(() => ({ inputAssetsByFilename: new Map() })) would match the project convention and make the hoisting explicit.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done — switched to a single vi.hoisted(() => ({ inputAssetsByFilename, getNodeByExecutionId, resolveComboValues })) container in f0299e5, matching the project convention.

mockGetNodeByExecutionId(...args)
}))

const mockResolveComboValues = vi.fn()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: same hoisting story for mockGetNodeByExecutionId / mockResolveComboValues. Works because the inner refs are only dereferenced when the mocked fns are called, but vi.hoisted() removes the latent TDZ trap and signals intent to the next editor.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done — getNodeByExecutionId / resolveComboValues now live in the same hoisted container and are assigned directly into the mock factories, removing the module-level vi.fn() consts.

pendingSelection: {},
uploadState: {},
missingMediaCandidates: null,
removeMissingMediaByName: vi.fn()

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: removeMissingMediaByName: vi.fn() (and updateInputs, addAlert further down) are wired up but never asserted. Either drop them from the mocks, or add a confirmSelection / handleUpload test that actually exercises them.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dropped updateInputs / removeMissingMediaByName from the mocks — the tested paths (getMediaDisplayName, getLibraryOptions) never call them. Kept the toastStore module mock as a needed boundary. A dedicated confirmSelection / handleUpload spec is a worthwhile follow-up but out of scope here.

@DrJKL DrJKL assigned dante01yoon and unassigned DrJKL May 26, 2026
- Hoist mutable mock state via vi.hoisted to match test conventions
- Drop unused store mock fns (updateInputs, removeMissingMediaByName)
- Remove redundant name re-assignment in OSS display_name fixture
@dante01yoon dante01yoon dismissed stale reviews from DrJKL and coderabbitai[bot] via f0299e5 May 27, 2026 08:10
coderabbitai[bot]
coderabbitai Bot previously approved these changes May 27, 2026
@dante01yoon dante01yoon assigned DrJKL and unassigned dante01yoon May 27, 2026
@dante01yoon dante01yoon requested a review from DrJKL May 27, 2026 08:36
DrJKL
DrJKL previously approved these changes May 28, 2026
@DrJKL DrJKL removed their assignment May 28, 2026
…igrate-assetmetadatautilsts-helpers-to-unified-asset

# Conflicts:
#	src/platform/assets/utils/assetMetadataUtils.ts
#	src/platform/missingMedia/composables/useMissingMediaInteractions.ts
@dante01yoon dante01yoon dismissed stale reviews from DrJKL and coderabbitai[bot] via c52dcfc June 17, 2026 13:06
@dante01yoon dante01yoon changed the title refactor(assets): consume unified display_name across helpers (FE-747, FE-748) docs(assets): unify display_name helper docstrings + fixture tests (FE-747) Jun 17, 2026
@github-actions

github-actions Bot commented Jun 18, 2026

Copy link
Copy Markdown

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 06/26/2026, 12:16:39 AM UTC

Links

🎭 Playwright: ✅ 1687 passed, 0 failed · 2 flaky

📊 Browser Reports
  • chromium: View Report (✅ 1666 / ❌ 0 / ⚠️ 2 / ⏭️ 5)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 18 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

📦 Bundle: 7.54 MB gzip 🟢 -27 B

Details

Summary

  • Raw size: 31.7 MB baseline 31.7 MB — 🟢 -173 B
  • Gzip: 7.54 MB baseline 7.54 MB — 🟢 -27 B
  • Brotli: 5.17 MB baseline 5.17 MB — 🔴 +114 B
  • Bundles: 295 current • 295 baseline • 135 added / 135 removed

Category Glance
Utilities & Hooks 🟢 -173 B (3.35 MB) · Vendor & Third-Party ⚪ 0 B (15.3 MB) · Other ⚪ 0 B (10.7 MB) · Graph Workspace ⚪ 0 B (1.25 MB) · Panels & Settings ⚪ 0 B (512 kB) · Data & Services ⚪ 0 B (269 kB) · + 5 more

App Entry Points — 46.9 kB (baseline 46.9 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-C5toiX48.js (removed) 46.9 kB 🟢 -46.9 kB 🟢 -13.8 kB 🟢 -11.9 kB
assets/index-D2t-jzzK.js (new) 46.9 kB 🔴 +46.9 kB 🔴 +13.8 kB 🔴 +12 kB

Status: 1 added / 1 removed

Graph Workspace — 1.25 MB (baseline 1.25 MB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-DJpj63qV.js (removed) 1.25 MB 🟢 -1.25 MB 🟢 -267 kB 🟢 -201 kB
assets/GraphView-DN7X_kfy.js (new) 1.25 MB 🔴 +1.25 MB 🔴 +267 kB 🔴 +201 kB

Status: 1 added / 1 removed

Views & Navigation — 97.7 kB (baseline 97.7 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CUhDQZPF.js (removed) 19.4 kB 🟢 -19.4 kB 🟢 -5.03 kB 🟢 -4.46 kB
assets/CloudSurveyView-WwsA1z8n.js (new) 19.4 kB 🔴 +19.4 kB 🔴 +5.03 kB 🔴 +4.47 kB
assets/CloudLoginView-CCJ3bAob.js (removed) 11.4 kB 🟢 -11.4 kB 🟢 -3.07 kB 🟢 -2.67 kB
assets/CloudLoginView-DUGdhl9H.js (new) 11.4 kB 🔴 +11.4 kB 🔴 +3.07 kB 🔴 +2.69 kB
assets/CloudSignupView-DiRbxAgB.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.74 kB 🟢 -2.4 kB
assets/CloudSignupView-Dq1NuA-f.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.74 kB 🔴 +2.41 kB
assets/CloudLayoutView-C9u2k8iX.js (new) 9.36 kB 🔴 +9.36 kB 🔴 +2.34 kB 🔴 +2.03 kB
assets/CloudLayoutView-D-OYQdY-.js (removed) 9.36 kB 🟢 -9.36 kB 🟢 -2.34 kB 🟢 -2.03 kB
assets/UserCheckView-CJc1pRuV.js (removed) 8.8 kB 🟢 -8.8 kB 🟢 -2.22 kB 🟢 -1.93 kB
assets/UserCheckView-CJF0zPNu.js (new) 8.8 kB 🔴 +8.8 kB 🔴 +2.22 kB 🔴 +1.93 kB
assets/CloudSubscriptionRedirectView-5J0qevfC.js (new) 6.63 kB 🔴 +6.63 kB 🔴 +2.46 kB 🔴 +2.16 kB
assets/CloudSubscriptionRedirectView-bwLl4l7q.js (removed) 6.63 kB 🟢 -6.63 kB 🟢 -2.46 kB 🟢 -2.15 kB
assets/UserSelectView-BA8tdjps.js (removed) 6 kB 🟢 -6 kB 🟢 -2.15 kB 🟢 -1.89 kB
assets/UserSelectView-Bu5Ch6lH.js (new) 6 kB 🔴 +6 kB 🔴 +2.15 kB 🔴 +1.89 kB
assets/CloudForgotPasswordView-CdJRVhxF.js (new) 5.15 kB 🔴 +5.15 kB 🔴 +1.76 kB 🔴 +1.54 kB
assets/CloudForgotPasswordView-CJTieoQr.js (removed) 5.15 kB 🟢 -5.15 kB 🟢 -1.76 kB 🟢 -1.53 kB
assets/CloudAuthTimeoutView-0E3usPNE.js (new) 4.49 kB 🔴 +4.49 kB 🔴 +1.57 kB 🔴 +1.36 kB
assets/CloudAuthTimeoutView-BAchmWu2.js (removed) 4.49 kB 🟢 -4.49 kB 🟢 -1.57 kB 🟢 -1.36 kB

Status: 9 added / 9 removed / 3 unchanged

Panels & Settings — 512 kB (baseline 512 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/KeybindingPanel-BRzTwoWY.js (new) 49.5 kB 🔴 +49.5 kB 🔴 +9.98 kB 🔴 +8.83 kB
assets/KeybindingPanel-D4i8qsN3.js (removed) 49.5 kB 🟢 -49.5 kB 🟢 -9.98 kB 🟢 -8.83 kB
assets/SecretsPanel-AFbPDe1G.js (removed) 24.2 kB 🟢 -24.2 kB 🟢 -5.77 kB 🟢 -5.06 kB
assets/SecretsPanel-Cdu-LKdW.js (new) 24.2 kB 🔴 +24.2 kB 🔴 +5.77 kB 🔴 +5.06 kB
assets/CreditsPanel-C3ultw5G.js (removed) 15.6 kB 🟢 -15.6 kB 🟢 -4.61 kB 🟢 -4.04 kB
assets/CreditsPanel-XtwxuHBc.js (new) 15.6 kB 🔴 +15.6 kB 🔴 +4.61 kB 🔴 +4.05 kB
assets/AboutPanel-Bhm3HBi_.js (removed) 11.7 kB 🟢 -11.7 kB 🟢 -3.23 kB 🟢 -2.89 kB
assets/AboutPanel-C7xl1PRy.js (new) 11.7 kB 🔴 +11.7 kB 🔴 +3.23 kB 🔴 +2.89 kB
assets/SubscriptionPanel-bj7ouuTe.js (removed) 11.2 kB 🟢 -11.2 kB 🟢 -3.52 kB 🟢 -3.1 kB
assets/SubscriptionPanel-Da5NIIUH.js (new) 11.2 kB 🔴 +11.2 kB 🔴 +3.53 kB 🔴 +3.1 kB
assets/ExtensionPanel-BGf-rFXz.js (new) 9.03 kB 🔴 +9.03 kB 🔴 +2.49 kB 🔴 +2.2 kB
assets/ExtensionPanel-DaWVmZ_a.js (removed) 9.03 kB 🟢 -9.03 kB 🟢 -2.49 kB 🟢 -2.19 kB
assets/ServerConfigPanel-CMMpHNzz.js (removed) 6.15 kB 🟢 -6.15 kB 🟢 -1.98 kB 🟢 -1.75 kB
assets/ServerConfigPanel-PsqhfXGs.js (new) 6.15 kB 🔴 +6.15 kB 🔴 +1.98 kB 🔴 +1.75 kB
assets/UserPanel-Bsk3fMCb.js (removed) 5.78 kB 🟢 -5.78 kB 🟢 -1.82 kB 🟢 -1.57 kB
assets/UserPanel-uar8pGba.js (new) 5.78 kB 🔴 +5.78 kB 🔴 +1.82 kB 🔴 +1.57 kB
assets/refreshRemoteConfig-Bfc8isU9.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.06 kB 🔴 +942 B
assets/refreshRemoteConfig-Cci8VqYb.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.06 kB 🟢 -941 B
assets/cloudRemoteConfig-BktRBPJU.js (removed) 990 B 🟢 -990 B 🟢 -542 B 🟢 -470 B
assets/cloudRemoteConfig-CtmFyZ26.js (new) 990 B 🔴 +990 B 🔴 +540 B 🔴 +474 B
assets/refreshRemoteConfig-BdzuxMZ2.js (removed) 110 B 🟢 -110 B 🟢 -89 B 🟢 -82 B
assets/refreshRemoteConfig-sbJ6qEsr.js (new) 110 B 🔴 +110 B 🔴 +89 B 🔴 +81 B

Status: 11 added / 11 removed / 15 unchanged

User & Accounts — 26.9 kB (baseline 26.9 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SignUpForm-DFPWwjJ3.js (new) 10 kB 🔴 +10 kB 🔴 +3.46 kB 🔴 +3.03 kB
assets/SignUpForm-DjXIH760.js (removed) 10 kB 🟢 -10 kB 🟢 -3.46 kB 🟢 -3.04 kB
assets/auth-5cKzJ2Ig.js (new) 3.69 kB 🔴 +3.69 kB 🔴 +1.3 kB 🔴 +1.13 kB
assets/auth-CdkHTTnd.js (removed) 3.69 kB 🟢 -3.69 kB 🟢 -1.3 kB 🟢 -1.13 kB
assets/usePostAuthRedirect-CASf9yML.js (new) 3.33 kB 🔴 +3.33 kB 🔴 +1.27 kB 🔴 +1.11 kB
assets/usePostAuthRedirect-DmzzixVV.js (removed) 3.33 kB 🟢 -3.33 kB 🟢 -1.27 kB 🟢 -1.1 kB
assets/UpdatePasswordContent-BdolNm8q.js (new) 1.92 kB 🔴 +1.92 kB 🔴 +876 B 🔴 +764 B
assets/UpdatePasswordContent-DkyZgMkf.js (removed) 1.92 kB 🟢 -1.92 kB 🟢 -876 B 🟢 -764 B
assets/authStore-CENEjpvJ.js (removed) 130 B 🟢 -130 B 🟢 -109 B 🟢 -108 B
assets/authStore-ovmDchS3.js (new) 130 B 🔴 +130 B 🔴 +109 B 🔴 +119 B
assets/workspaceAuthStore-12Oz2K1N.js (removed) 110 B 🟢 -110 B 🟢 -104 B 🟢 -114 B
assets/workspaceAuthStore-B3kq6bKb.js (new) 110 B 🔴 +110 B 🔴 +104 B 🔴 +114 B
assets/auth-5mjnhyUd.js (removed) 105 B 🟢 -105 B 🟢 -96 B 🟢 -84 B
assets/auth-CpK-CI_j.js (new) 105 B 🔴 +105 B 🔴 +96 B 🔴 +80 B

Status: 7 added / 7 removed / 3 unchanged

Editors & Dialogs — 112 kB (baseline 112 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyHubPublishDialog-ChZsKfxZ.js (removed) 86 kB 🟢 -86 kB 🟢 -18.6 kB 🟢 -15.9 kB
assets/ComfyHubPublishDialog-eGhpY29e.js (new) 86 kB 🔴 +86 kB 🔴 +18.6 kB 🔴 +15.9 kB
assets/useShareDialog-CeWj3W-W.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.53 kB 🔴 +4.92 kB
assets/useShareDialog-CksjZ7vz.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.53 kB 🟢 -4.9 kB
assets/ComfyHubPublishDialog-7w0uMxAo.js (removed) 143 B 🟢 -143 B 🟢 -105 B 🟢 -91 B
assets/ComfyHubPublishDialog-COwm-w1M.js (new) 143 B 🔴 +143 B 🔴 +105 B 🔴 +89 B
assets/useSubscriptionDialog-B1rWBQ8L.js (new) 110 B 🔴 +110 B 🔴 +102 B 🔴 +91 B
assets/useSubscriptionDialog-BtKxDY0P.js (removed) 110 B 🟢 -110 B 🟢 -102 B 🟢 -88 B

Status: 4 added / 4 removed / 1 unchanged

UI Components — 65.2 kB (baseline 65.2 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-Bkv4W9Vp.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.82 kB 🟢 -3.41 kB
assets/ComfyQueueButton-kfgP2Eew.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.82 kB 🔴 +3.41 kB
assets/useTerminalTabs-DiBLJEeB.js (new) 12.1 kB 🔴 +12.1 kB 🔴 +3.83 kB 🔴 +3.38 kB
assets/useTerminalTabs-ZGF-CokQ.js (removed) 12.1 kB 🟢 -12.1 kB 🟢 -3.83 kB 🟢 -3.38 kB
assets/SubscribeButton-KbZxw5zp.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.04 kB 🔴 +904 B
assets/SubscribeButton-kLjfX4YL.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.04 kB 🟢 -903 B
assets/cloudFeedbackTopbarButton-IF8fuo3e.js (new) 829 B 🔴 +829 B 🔴 +496 B 🔴 +446 B
assets/cloudFeedbackTopbarButton-S_s0_fpI.js (removed) 829 B 🟢 -829 B 🟢 -496 B 🟢 -454 B
assets/ComfyQueueButton-BjFAKa4k.js (new) 128 B 🔴 +128 B 🔴 +99 B 🔴 +89 B
assets/ComfyQueueButton-ClvMT3Vd.js (removed) 128 B 🟢 -128 B 🟢 -99 B 🟢 -89 B

Status: 5 added / 5 removed / 9 unchanged

Data & Services — 269 kB (baseline 269 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/load3dService-8nBTJlyB.js (new) 126 kB 🔴 +126 kB 🔴 +27.8 kB 🔴 +23.5 kB
assets/load3dService-C8nltDrM.js (removed) 126 kB 🟢 -126 kB 🟢 -27.8 kB 🟢 -23.5 kB
assets/api-DbxddESh.js (new) 91.9 kB 🔴 +91.9 kB 🔴 +25.3 kB 🔴 +21.6 kB
assets/api-Fx6CtW_f.js (removed) 91.9 kB 🟢 -91.9 kB 🟢 -25.3 kB 🟢 -21.7 kB
assets/workflowShareService-_rtsgS8I.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.9 kB 🟢 -4.35 kB
assets/workflowShareService-DdHoN7T5.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.91 kB 🔴 +4.35 kB
assets/releaseStore-C43xj2EC.js (removed) 8.29 kB 🟢 -8.29 kB 🟢 -2.34 kB 🟢 -2.04 kB
assets/releaseStore-CmdD1h80.js (new) 8.29 kB 🔴 +8.29 kB 🔴 +2.33 kB 🔴 +2.04 kB
assets/keybindingService-BYH4BoNl.js (removed) 7.12 kB 🟢 -7.12 kB 🟢 -1.77 kB 🟢 -1.53 kB
assets/keybindingService-D0ZrSimv.js (new) 7.12 kB 🔴 +7.12 kB 🔴 +1.76 kB 🔴 +1.53 kB
assets/extensionStore-C0z7JC-K.js (new) 5.29 kB 🔴 +5.29 kB 🔴 +1.86 kB 🔴 +1.57 kB
assets/extensionStore-DLnJIr2j.js (removed) 5.29 kB 🟢 -5.29 kB 🟢 -1.86 kB 🟢 -1.57 kB
assets/userStore-9xP84NR5.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +933 B 🔴 +821 B
assets/userStore-CZH1XO2O.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -934 B 🟢 -824 B
assets/audioService-D3Eoemph.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -858 B 🟢 -751 B
assets/audioService-PIJqu4zo.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +860 B 🔴 +746 B
assets/dialogService-C9GF-WhD.js (removed) 100 B 🟢 -100 B 🟢 -99 B 🟢 -90 B
assets/dialogService-mn1JJ6j2.js (new) 100 B 🔴 +100 B 🔴 +99 B 🔴 +95 B
assets/settingStore-BI7NUncH.js (new) 98 B 🔴 +98 B 🔴 +98 B 🔴 +100 B
assets/settingStore-DdOqPmTI.js (removed) 98 B 🟢 -98 B 🟢 -98 B 🟢 -102 B
assets/assetsStore-CdBBJRVK.js (new) 96 B 🔴 +96 B 🔴 +97 B 🔴 +89 B
assets/assetsStore-D-elvKEQ.js (removed) 96 B 🟢 -96 B 🟢 -97 B 🟢 -88 B
assets/releaseStore-Bk7sElu0.js (removed) 95 B 🟢 -95 B 🟢 -86 B 🟢 -84 B
assets/releaseStore-dSKaaRAi.js (new) 95 B 🔴 +95 B 🔴 +86 B 🔴 +79 B
assets/api-CArTjIH1.js (new) 62 B 🔴 +62 B 🔴 +74 B 🔴 +66 B
assets/api-Cq1eoJxF.js (removed) 62 B 🟢 -62 B 🟢 -74 B 🟢 -66 B

Status: 13 added / 13 removed / 3 unchanged

Utilities & Hooks — 3.35 MB (baseline 3.35 MB) • 🟢 -173 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/promotionUtils-Bzn8oKc9.js (removed) 2.99 MB 🟢 -2.99 MB 🟢 -691 kB 🟢 -521 kB
assets/promotionUtils-CRy7k0Ia.js (new) 2.99 MB 🔴 +2.99 MB 🔴 +691 kB 🔴 +521 kB
assets/useConflictDetection-AazQ8UXJ.js (removed) 234 kB 🟢 -234 kB 🟢 -52.3 kB 🟢 -42.6 kB
assets/useConflictDetection-DIlZ6ozI.js (new) 234 kB 🔴 +234 kB 🔴 +52.3 kB 🔴 +42.6 kB
assets/useLoad3d-C3v8miEF.js (removed) 25.5 kB 🟢 -25.5 kB 🟢 -5.75 kB 🟢 -5.09 kB
assets/useLoad3d-D_GhCxQO.js (new) 25.5 kB 🔴 +25.5 kB 🔴 +5.75 kB 🔴 +5.09 kB
assets/useLoad3dViewer-CI7tZ8Rt.js (removed) 21.1 kB 🟢 -21.1 kB 🟢 -4.98 kB 🟢 -4.37 kB
assets/useLoad3dViewer-CNZUIB0X.js (new) 21.1 kB 🔴 +21.1 kB 🔴 +4.98 kB 🔴 +4.35 kB
assets/useImageQuiet-BCtJ0CtY.js (removed) 10.4 kB 🟢 -10.4 kB 🟢 -3.5 kB 🟢 -3.01 kB
assets/useImageQuiet--kazYImE.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +3.44 kB 🔴 +2.95 kB
assets/useFeatureFlags-BDGdpN6X.js (new) 5.55 kB 🔴 +5.55 kB 🔴 +1.7 kB 🔴 +1.46 kB
assets/useFeatureFlags-CNpHmQut.js (removed) 5.55 kB 🟢 -5.55 kB 🟢 -1.71 kB 🟢 -1.46 kB
assets/subscriptionCheckoutUtil-C8XmCFfg.js (new) 3.52 kB 🔴 +3.52 kB 🔴 +1.45 kB 🔴 +1.26 kB
assets/subscriptionCheckoutUtil-lEZAtURS.js (removed) 3.52 kB 🟢 -3.52 kB 🟢 -1.45 kB 🟢 -1.25 kB
assets/useSessionCookie-Boj73QzH.js (removed) 3.33 kB 🟢 -3.33 kB 🟢 -1.15 kB 🟢 -977 B
assets/useSessionCookie-BrbrUjus.js (new) 3.33 kB 🔴 +3.33 kB 🔴 +1.14 kB 🔴 +980 B
assets/useDowngradeToPersonal-7Yju-T66.js (new) 3 kB 🔴 +3 kB 🔴 +1.19 kB 🔴 +1.05 kB
assets/useDowngradeToPersonal-DSb-LFfo.js (removed) 3 kB 🟢 -3 kB 🟢 -1.18 kB 🟢 -1.05 kB
assets/assetPreviewUtil--SHIAxEh.js (removed) 2.41 kB 🟢 -2.41 kB 🟢 -1.01 kB 🟢 -884 B
assets/assetPreviewUtil-CQgdvGud.js (new) 2.41 kB 🔴 +2.41 kB 🔴 +1 kB 🔴 +878 B
assets/useUpstreamValue-D_DcNNSG.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +792 B 🔴 +699 B
assets/useUpstreamValue-EiP_OBPt.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -793 B 🟢 -699 B
assets/useWorkspaceTierLabel-CiRUGH2n.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +852 B 🔴 +731 B
assets/useWorkspaceTierLabel-sF7gTw_Y.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -851 B 🟢 -734 B
assets/useLoad3d-Dwu5nprk.js (new) 311 B 🔴 +311 B 🔴 +164 B 🔴 +146 B
assets/useLoad3d-DwWm3n51.js (removed) 311 B 🟢 -311 B 🟢 -164 B 🟢 -148 B
assets/useSessionCookie-DJLqFpWn.js (new) 101 B 🔴 +101 B 🔴 +86 B 🔴 +81 B
assets/useSessionCookie-DjqZzNFF.js (removed) 101 B 🟢 -101 B 🟢 -86 B 🟢 -80 B
assets/useFeatureFlags-BkF8MYlg.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -86 B
assets/useFeatureFlags-Booak0zF.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +80 B
assets/useLoad3dViewer-Co2QNu34.js (removed) 98 B 🟢 -98 B 🟢 -85 B 🟢 -87 B
assets/useLoad3dViewer-LOh3LazN.js (new) 98 B 🔴 +98 B 🔴 +85 B 🔴 +86 B
assets/useCurrentUser-D4AGgP-e.js (removed) 96 B 🟢 -96 B 🟢 -97 B 🟢 -82 B
assets/useCurrentUser-DdnvD57d.js (new) 96 B 🔴 +96 B 🔴 +97 B 🔴 +90 B

Status: 17 added / 17 removed / 15 unchanged

Vendor & Third-Party — 15.3 MB (baseline 15.3 MB) • ⚪ 0 B

External libraries and shared vendor chunks

Status: 16 unchanged

Other — 10.7 MB (baseline 10.7 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-B3O1ybhc.js (new) 119 kB 🔴 +119 kB 🔴 +30.6 kB 🔴 +25.9 kB
assets/core-D8wVxttx.js (removed) 119 kB 🟢 -119 kB 🟢 -30.6 kB 🟢 -25.9 kB
assets/WidgetSelect-BE-fD4nn.js (new) 83.9 kB 🔴 +83.9 kB 🔴 +18.3 kB 🔴 +15.8 kB
assets/WidgetSelect-Dz_4aIPe.js (removed) 83.9 kB 🟢 -83.9 kB 🟢 -18.3 kB 🟢 -15.9 kB
assets/Load3DControls-B9RT-9wn.js (removed) 46.8 kB 🟢 -46.8 kB 🟢 -7.56 kB 🟢 -6.62 kB
assets/Load3DControls-D5erSUFA.js (new) 46.8 kB 🔴 +46.8 kB 🔴 +7.56 kB 🔴 +6.61 kB
assets/SubscriptionTransitionPreviewWorkspace-CzMNx5iY.js (new) 45.7 kB 🔴 +45.7 kB 🔴 +9.48 kB 🔴 +8.37 kB
assets/SubscriptionTransitionPreviewWorkspace-DJEDh0hu.js (removed) 45.7 kB 🟢 -45.7 kB 🟢 -9.48 kB 🟢 -8.37 kB
assets/SubscriptionRequiredDialogContentUnified-BJyuQBJh.js (removed) 41.2 kB 🟢 -41.2 kB 🟢 -9.15 kB 🟢 -7.96 kB
assets/SubscriptionRequiredDialogContentUnified-DxMKCYes.js (new) 41.2 kB 🔴 +41.2 kB 🔴 +9.15 kB 🔴 +7.96 kB
assets/WorkspacePanelContent-CDjuKl2b.js (new) 34.5 kB 🔴 +34.5 kB 🔴 +7.48 kB 🔴 +6.6 kB
assets/WorkspacePanelContent-CMStp8dc.js (removed) 34.5 kB 🟢 -34.5 kB 🟢 -7.48 kB 🟢 -6.6 kB
assets/WidgetPainter-BolPZH9M.js (new) 32.7 kB 🔴 +32.7 kB 🔴 +7.9 kB 🔴 +6.98 kB
assets/WidgetPainter-DNn1riof.js (removed) 32.7 kB 🟢 -32.7 kB 🟢 -7.9 kB 🟢 -6.99 kB
assets/Load3dViewerContent-CFlBee2i.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -6.29 kB 🟢 -5.46 kB
assets/Load3dViewerContent-CIxaUzOL.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +6.3 kB 🔴 +5.46 kB
assets/WidgetBoundingBoxes-D9DrJxpQ.js (new) 28.6 kB 🔴 +28.6 kB 🔴 +7.9 kB 🔴 +7 kB
assets/WidgetBoundingBoxes-DOJ9Fhg6.js (removed) 28.6 kB 🟢 -28.6 kB 🟢 -7.9 kB 🟢 -7.01 kB
assets/SubscriptionRequiredDialogContent-BfQpVVK7.js (removed) 26.8 kB 🟢 -26.8 kB 🟢 -6.63 kB 🟢 -5.84 kB
assets/SubscriptionRequiredDialogContent-DDS8412E.js (new) 26.8 kB 🔴 +26.8 kB 🔴 +6.63 kB 🔴 +5.84 kB
assets/SubscriptionPanelContentWorkspace-BTbw8icj.js (removed) 24.8 kB 🟢 -24.8 kB 🟢 -5.78 kB 🟢 -5.07 kB
assets/SubscriptionPanelContentWorkspace-DvdPc0iU.js (new) 24.8 kB 🔴 +24.8 kB 🔴 +5.78 kB 🔴 +5.07 kB
assets/SubscriptionRequiredDialogContentWorkspace-D9TYlpc3.js (new) 24.6 kB 🔴 +24.6 kB 🔴 +5.65 kB 🔴 +4.97 kB
assets/SubscriptionRequiredDialogContentWorkspace-DSe4DwJj.js (removed) 24.6 kB 🟢 -24.6 kB 🟢 -5.65 kB 🟢 -4.96 kB
assets/WidgetImageCrop-BhC_N05n.js (removed) 23.3 kB 🟢 -23.3 kB 🟢 -5.75 kB 🟢 -5.03 kB
assets/WidgetImageCrop-Bne9559b.js (new) 23.3 kB 🔴 +23.3 kB 🔴 +5.75 kB 🔴 +5.04 kB
assets/load3d-BIJpxN4o.js (new) 21.2 kB 🔴 +21.2 kB 🔴 +5.18 kB 🔴 +4.49 kB
assets/load3d-BoiPknhF.js (removed) 21.2 kB 🟢 -21.2 kB 🟢 -5.18 kB 🟢 -4.49 kB
assets/CurrentUserPopoverWorkspace-Biv8ASZd.js (removed) 20.5 kB 🟢 -20.5 kB 🟢 -4.7 kB 🟢 -4.2 kB
assets/CurrentUserPopoverWorkspace-Dt4xdoTT.js (new) 20.5 kB 🔴 +20.5 kB 🔴 +4.7 kB 🔴 +4.19 kB
assets/SignInContent-DYnO742E.js (removed) 20.1 kB 🟢 -20.1 kB 🟢 -5.07 kB 🟢 -4.43 kB
assets/SignInContent-tRWL_iBq.js (new) 20.1 kB 🔴 +20.1 kB 🔴 +5.07 kB 🔴 +4.43 kB
assets/Load3D-D86xXLgl.js (new) 19.1 kB 🔴 +19.1 kB 🔴 +4.51 kB 🔴 +3.94 kB
assets/Load3D-DpJJUeg3.js (removed) 19.1 kB 🟢 -19.1 kB 🟢 -4.51 kB 🟢 -3.93 kB
assets/WidgetInputNumber-CTzlXoCd.js (removed) 19 kB 🟢 -19 kB 🟢 -4.79 kB 🟢 -4.25 kB
assets/WidgetInputNumber-D3BPkzBo.js (new) 19 kB 🔴 +19 kB 🔴 +4.79 kB 🔴 +4.25 kB
assets/CreditsTile-BXUSjkOC.js (removed) 17 kB 🟢 -17 kB 🟢 -4.52 kB 🟢 -3.98 kB
assets/CreditsTile-jPHEv-GP.js (new) 17 kB 🔴 +17 kB 🔴 +4.52 kB 🔴 +3.98 kB
assets/WidgetRecordAudio-CTRuu355.js (removed) 16.6 kB 🟢 -16.6 kB 🟢 -4.63 kB 🟢 -4.14 kB
assets/WidgetRecordAudio-hEpI1jB3.js (new) 16.6 kB 🔴 +16.6 kB 🔴 +4.63 kB 🔴 +4.14 kB
assets/WidgetRange-CAM1G10I.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.17 kB 🟢 -3.73 kB
assets/WidgetRange-Dd0RZUIg.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.17 kB 🔴 +3.72 kB
assets/WaveAudioPlayer-CLompg3I.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.48 kB 🟢 -3.06 kB
assets/WaveAudioPlayer-hl8OkVRW.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.48 kB 🔴 +3.05 kB
assets/WidgetCurve-Cr5bf1-v.js (removed) 11.3 kB 🟢 -11.3 kB 🟢 -3.5 kB 🟢 -3.18 kB
assets/WidgetCurve-DNr37EvL.js (new) 11.3 kB 🔴 +11.3 kB 🔴 +3.5 kB 🔴 +3.16 kB
assets/TeamWorkspacesDialogContent-Ck1LZtp8.js (removed) 10.3 kB 🟢 -10.3 kB 🟢 -3 kB 🟢 -2.65 kB
assets/TeamWorkspacesDialogContent-HKiddVaN.js (new) 10.3 kB 🔴 +10.3 kB 🔴 +3 kB 🔴 +2.66 kB
assets/Load3DConfiguration-2Oh-CtYJ.js (removed) 9.02 kB 🟢 -9.02 kB 🟢 -2.66 kB 🟢 -2.35 kB
assets/Load3DConfiguration-CaaRAfGg.js (new) 9.02 kB 🔴 +9.02 kB 🔴 +2.66 kB 🔴 +2.35 kB
assets/nodeTemplates-1UiypXDP.js (new) 8.33 kB 🔴 +8.33 kB 🔴 +2.88 kB 🔴 +2.54 kB
assets/nodeTemplates-CW-NEHYJ.js (removed) 8.33 kB 🟢 -8.33 kB 🟢 -2.88 kB 🟢 -2.54 kB
assets/onboardingCloudRoutes-Daa-FLYo.js (removed) 8.28 kB 🟢 -8.28 kB 🟢 -2.58 kB 🟢 -2.21 kB
assets/onboardingCloudRoutes-DJVzRDPW.js (new) 8.28 kB 🔴 +8.28 kB 🔴 +2.59 kB 🔴 +2.23 kB
assets/NightlySurveyController-5HCKlTqp.js (removed) 7.95 kB 🟢 -7.95 kB 🟢 -2.7 kB 🟢 -2.37 kB
assets/NightlySurveyController-B8R7OulJ.js (new) 7.95 kB 🔴 +7.95 kB 🔴 +2.7 kB 🔴 +2.4 kB
assets/InviteMemberDialogContent-CQW-2Rkp.js (new) 6.76 kB 🔴 +6.76 kB 🔴 +2.22 kB 🔴 +1.96 kB
assets/InviteMemberDialogContent-ELSHTJdp.js (removed) 6.76 kB 🟢 -6.76 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/WidgetWithControl-BFGq5Wtn.js (new) 6.3 kB 🔴 +6.3 kB 🔴 +2.54 kB 🔴 +2.27 kB
assets/WidgetWithControl-CSihL16L.js (removed) 6.3 kB 🟢 -6.3 kB 🟢 -2.54 kB 🟢 -2.26 kB
assets/tierBenefits-BIM1iB2D.js (removed) 5.94 kB 🟢 -5.94 kB 🟢 -1.9 kB 🟢 -1.65 kB
assets/tierBenefits-DaAxVp0f.js (new) 5.94 kB 🔴 +5.94 kB 🔴 +1.9 kB 🔴 +1.65 kB
assets/load3dPreviewExtensions-AZF7Nh2k.js (removed) 5.38 kB 🟢 -5.38 kB 🟢 -1.75 kB 🟢 -1.55 kB
assets/load3dPreviewExtensions-Bv6A52Jx.js (new) 5.38 kB 🔴 +5.38 kB 🔴 +1.75 kB 🔴 +1.55 kB
assets/FreeTierDialogContent-CI-9EuN2.js (new) 5.23 kB 🔴 +5.23 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/FreeTierDialogContent-Czze90mz.js (removed) 5.23 kB 🟢 -5.23 kB 🟢 -1.77 kB 🟢 -1.55 kB
assets/CreateWorkspaceDialogContent-Der-JKxU.js (new) 5.19 kB 🔴 +5.19 kB 🔴 +1.82 kB 🔴 +1.58 kB
assets/CreateWorkspaceDialogContent-KzU77iAu.js (removed) 5.19 kB 🟢 -5.19 kB 🟢 -1.82 kB 🟢 -1.58 kB
assets/missingModelDownload-BPNziFp-.js (removed) 5.07 kB 🟢 -5.07 kB 🟢 -1.98 kB 🟢 -1.72 kB
assets/missingModelDownload-CSs2X1XC.js (new) 5.07 kB 🔴 +5.07 kB 🔴 +1.98 kB 🔴 +1.72 kB
assets/ChangeMemberRoleDialogContent-BLTob8mt.js (removed) 5.04 kB 🟢 -5.04 kB 🟢 -1.66 kB 🟢 -1.45 kB
assets/ChangeMemberRoleDialogContent-C7qr7XMR.js (new) 5.04 kB 🔴 +5.04 kB 🔴 +1.67 kB 🔴 +1.47 kB
assets/EditWorkspaceDialogContent-D69ifN0C.js (removed) 5 kB 🟢 -5 kB 🟢 -1.79 kB 🟢 -1.56 kB
assets/EditWorkspaceDialogContent-Dtn6snjX.js (new) 5 kB 🔴 +5 kB 🔴 +1.79 kB 🔴 +1.56 kB
assets/WidgetTextarea-B05Kc4ff.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.9 kB 🔴 +1.65 kB
assets/WidgetTextarea-C3FffpKI.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.89 kB 🟢 -1.66 kB
assets/saveMesh-CkCJHJay.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.55 kB 🟢 -1.37 kB
assets/saveMesh-pYxxPuWl.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.55 kB 🔴 +1.37 kB
assets/Preview3d-B7fg0bM6.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.43 kB 🔴 +1.24 kB
assets/Preview3d-Bgpc8FSL.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.43 kB 🟢 -1.23 kB
assets/ValueControlPopover-Crywl4fv.js (removed) 4.55 kB 🟢 -4.55 kB 🟢 -1.59 kB 🟢 -1.41 kB
assets/ValueControlPopover-CuNNY8GW.js (new) 4.55 kB 🔴 +4.55 kB 🔴 +1.59 kB 🔴 +1.42 kB
assets/CancelSubscriptionDialogContent-BeXhHV2L.js (removed) 4.54 kB 🟢 -4.54 kB 🟢 -1.65 kB 🟢 -1.44 kB
assets/CancelSubscriptionDialogContent-D_Gr_LEB.js (new) 4.54 kB 🔴 +4.54 kB 🔴 +1.65 kB 🔴 +1.44 kB
assets/DeleteWorkspaceDialogContent-C9DnZJk1.js (removed) 3.91 kB 🟢 -3.91 kB 🟢 -1.47 kB 🟢 -1.27 kB
assets/DeleteWorkspaceDialogContent-lr_LJfOq.js (new) 3.91 kB 🔴 +3.91 kB 🔴 +1.47 kB 🔴 +1.27 kB
assets/LeaveWorkspaceDialogContent-Bn5zJCXo.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.41 kB 🟢 -1.22 kB
assets/LeaveWorkspaceDialogContent-BR9o_ahh.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.41 kB 🔴 +1.22 kB
assets/RemoveMemberDialogContent-CD767V5p.js (removed) 3.71 kB 🟢 -3.71 kB 🟢 -1.37 kB 🟢 -1.19 kB
assets/RemoveMemberDialogContent-YUHrPqCQ.js (new) 3.71 kB 🔴 +3.71 kB 🔴 +1.37 kB 🔴 +1.19 kB
assets/RevokeInviteDialogContent-DJYauzvK.js (removed) 3.63 kB 🟢 -3.63 kB 🟢 -1.38 kB 🟢 -1.21 kB
assets/RevokeInviteDialogContent-vdO65eR7.js (new) 3.63 kB 🔴 +3.63 kB 🔴 +1.38 kB 🔴 +1.21 kB
assets/InviteMemberUpsellDialogContent-BR3fvJyU.js (new) 3.47 kB 🔴 +3.47 kB 🔴 +1.25 kB 🔴 +1.09 kB
assets/InviteMemberUpsellDialogContent-CzgjXOX_.js (removed) 3.47 kB 🟢 -3.47 kB 🟢 -1.25 kB 🟢 -1.09 kB
assets/Media3DTop-BzqkCK0B.js (removed) 3.26 kB 🟢 -3.26 kB 🟢 -1.3 kB 🟢 -1.13 kB
assets/Media3DTop-rHVREPou.js (new) 3.26 kB 🔴 +3.26 kB 🔴 +1.3 kB 🔴 +1.13 kB
assets/GlobalToast-1Osch4by.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.26 kB 🟢 -1.08 kB
assets/GlobalToast-CQCWeBO2.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.26 kB 🔴 +1.08 kB
assets/load3dAdvanced-CnNZldjS.js (removed) 2.85 kB 🟢 -2.85 kB 🟢 -1.12 kB 🟢 -982 B
assets/load3dAdvanced-H_zQ96Fg.js (new) 2.85 kB 🔴 +2.85 kB 🔴 +1.12 kB 🔴 +982 B
assets/SubscribeToRun-CauXPGJ3.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.1 kB 🔴 +977 B
assets/SubscribeToRun-DwEtvRBF.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.1 kB 🟢 -975 B
assets/MediaImageTop-BjSvlnco.js (new) 2.06 kB 🔴 +2.06 kB 🔴 +991 B 🔴 +850 B
assets/MediaImageTop-BQ89O7JL.js (removed) 2.06 kB 🟢 -2.06 kB 🟢 -996 B 🟢 -859 B
assets/graphHasMissingNodes-949HIbJV.js (new) 1.93 kB 🔴 +1.93 kB 🔴 +906 B 🔴 +797 B
assets/graphHasMissingNodes-Dw-fba9X.js (removed) 1.93 kB 🟢 -1.93 kB 🟢 -904 B 🟢 -809 B
assets/MediaAudioTop-BNIaQgzK.js (removed) 1.67 kB 🟢 -1.67 kB 🟢 -837 B 🟢 -701 B
assets/MediaAudioTop-sn1d6kus.js (new) 1.67 kB 🔴 +1.67 kB 🔴 +836 B 🔴 +697 B
assets/CloudRunButtonWrapper-C3jiKfLR.js (removed) 1.13 kB 🟢 -1.13 kB 🟢 -549 B 🟢 -523 B
assets/CloudRunButtonWrapper-DZSSc7Vj.js (new) 1.13 kB 🔴 +1.13 kB 🔴 +550 B 🔴 +519 B
assets/cloudSessionCookie-Dp_ywlKO.js (new) 991 B 🔴 +991 B 🔴 +465 B 🔴 +425 B
assets/cloudSessionCookie-JYy5WEdd.js (removed) 991 B 🟢 -991 B 🟢 -470 B 🟢 -414 B
assets/cloudBadges-BBBtc2o-.js (new) 973 B 🔴 +973 B 🔴 +549 B 🔴 +498 B
assets/cloudBadges-BFGN_f7l.js (removed) 973 B 🟢 -973 B 🟢 -551 B 🟢 -471 B
assets/Load3DAdvanced-DHg8YnM9.js (new) 813 B 🔴 +813 B 🔴 +454 B 🔴 +409 B
assets/Load3DAdvanced-vBgZG4N0.js (removed) 813 B 🟢 -813 B 🟢 -454 B 🟢 -414 B
assets/nightlyBadges-B5JziMV4.js (removed) 464 B 🟢 -464 B 🟢 -306 B 🟢 -255 B
assets/nightlyBadges-BzdcSzym.js (new) 464 B 🔴 +464 B 🔴 +305 B 🔴 +256 B
assets/missingModelDownload-BgujGuiG.js (removed) 228 B 🟢 -228 B 🟢 -150 B 🟢 -130 B
assets/missingModelDownload-DmIyZP3c.js (new) 228 B 🔴 +228 B 🔴 +149 B 🔴 +128 B
assets/SubscriptionPanelContentWorkspace-BL04bSo5.js (removed) 179 B 🟢 -179 B 🟢 -117 B 🟢 -104 B
assets/SubscriptionPanelContentWorkspace-QRQk0u8p.js (new) 179 B 🔴 +179 B 🔴 +117 B 🔴 +104 B
assets/Load3dViewerContent-BdmiG_gW.js (removed) 137 B 🟢 -137 B 🟢 -103 B 🟢 -91 B
assets/Load3dViewerContent-D6Dfj5C8.js (new) 137 B 🔴 +137 B 🔴 +103 B 🔴 +91 B
assets/Load3DAdvanced-CpH_FzdX.js (removed) 122 B 🟢 -122 B 🟢 -97 B 🟢 -89 B
assets/Load3DAdvanced-DvOxymoe.js (new) 122 B 🔴 +122 B 🔴 +97 B 🔴 +89 B
assets/WidgetLegacy-BDRq558q.js (removed) 119 B 🟢 -119 B 🟢 -108 B 🟢 -93 B
assets/WidgetLegacy-BRBbffvI.js (new) 119 B 🔴 +119 B 🔴 +108 B 🔴 +93 B
assets/workflowDraftStoreV2-BzWon22Q.js (new) 113 B 🔴 +113 B 🔴 +105 B 🔴 +117 B
assets/workflowDraftStoreV2-C7mGNvH9.js (removed) 113 B 🟢 -113 B 🟢 -105 B 🟢 -112 B
assets/Load3D-8ULmgqQi.js (new) 98 B 🔴 +98 B 🔴 +89 B 🔴 +81 B
assets/Load3D-CtPmeGrd.js (removed) 98 B 🟢 -98 B 🟢 -89 B 🟢 -88 B
assets/changeTracker-BNXk7pL2.js (new) 93 B 🔴 +93 B 🔴 +95 B 🔴 +81 B
assets/changeTracker-DyvgaiXE.js (removed) 93 B 🟢 -93 B 🟢 -95 B 🟢 -80 B

Status: 67 added / 67 removed / 95 unchanged

⚡ Performance

⏳ Performance tests in progress…

@mattmillerai mattmillerai added the cursor-review Trigger multi-model Cursor agent review on this PR label Jun 25, 2026
…igrate-assetmetadatautilsts-helpers-to-unified-asset

# Conflicts:
#	src/platform/assets/utils/assetMetadataUtils.test.ts
* Human-readable filename for UI labels.
* Fallback: user_metadata.filename → metadata.filename → display_name → asset.name.
* For serialized identifiers use {@link getAssetFilename}.
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: (non-blocking) the shortened docstring drops "Use this helper for labels/titles only" — keeping that positive constraint alongside the existing cross-reference to getAssetFilename would make the display-vs-identifier distinction clear without needing to follow the link.

* `asset.name` is a content hash. Use this helper for labels/titles only;
* for serialized identifiers use {@link getAssetFilename}.
* Human-readable filename for UI labels.
* Fallback: user_metadata.filename → metadata.filename → display_name → asset.name.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: (non-blocking) every other export in this file opens with an imperative verb (Gets the..., Extracts..., Resolves...) — the new noun-phrase opening "Human-readable filename for UI labels." breaks that consistency.

id: 'oss-asset-id',
name: 'sunset.png',
hash: null,
display_name: undefined

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: (non-blocking) ossShape sets hash: null but none of the three new tests exercise getAssetStoredFilename or getAssetUrlFilename, which are the only functions that consume hash. The field is inert here — either add a stored-filename assertion or drop it to avoid implying coverage that is not there.

})

it('honours OSS-emitted display_name when present', () => {
const ossWithDisplayName: AssetItem = {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: (non-blocking) "honours OSS-emitted display_name when present" exercises the same branch as the existing "falls back to display_name when filename metadata is absent" test at line 365 — identical code path, different fixture string. Per the project parsimony guideline this could be folded into the existing suite or dropped.

* Human-readable filename for UI labels.
* Fallback: user_metadata.filename → metadata.filename → display_name → asset.name.
* For serialized identifiers use {@link getAssetFilename}.
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: (non-blocking) the shortened docstring drops "Use this helper for labels/titles only" — keeping that positive constraint alongside the existing cross-reference to getAssetFilename would make the display-vs-identifier distinction clear without needing to follow the link.

* `asset.name` is a content hash. Use this helper for labels/titles only;
* for serialized identifiers use {@link getAssetFilename}.
* Human-readable filename for UI labels.
* Fallback: user_metadata.filename → metadata.filename → display_name → asset.name.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: (non-blocking) every other export in this file opens with an imperative verb (Gets the..., Extracts..., Resolves...) — the new noun-phrase opening "Human-readable filename for UI labels." breaks that consistency.

id: 'oss-asset-id',
name: 'sunset.png',
hash: null,
display_name: undefined

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: (non-blocking) ossShape sets hash: null but none of the three new tests exercise getAssetStoredFilename or getAssetUrlFilename, which are the only functions that consume hash. The field is inert here — either add a stored-filename assertion or drop it to avoid implying coverage that is not there.

})

it('honours OSS-emitted display_name when present', () => {
const ossWithDisplayName: AssetItem = {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: (non-blocking) "honours OSS-emitted display_name when present" exercises the same branch as the existing "falls back to display_name when filename metadata is absent" test at line 365 — identical code path, different fixture string. Per the project parsimony guideline this could be folded into the existing suite or dropped.

* Human-readable filename for UI labels.
* Fallback: user_metadata.filename → metadata.filename → display_name → asset.name.
* For serialized identifiers use {@link getAssetFilename}.
*/

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: (non-blocking) the shortened docstring drops "Use this helper for labels/titles only" — keeping that positive constraint alongside the existing cross-reference to getAssetFilename would make the display-vs-identifier distinction clear without needing to follow the link.

* `asset.name` is a content hash. Use this helper for labels/titles only;
* for serialized identifiers use {@link getAssetFilename}.
* Human-readable filename for UI labels.
* Fallback: user_metadata.filename → metadata.filename → display_name → asset.name.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: (non-blocking) every other export in this file opens with an imperative verb (Gets the..., Extracts..., Resolves...) — the new noun-phrase opening "Human-readable filename for UI labels." breaks that consistency.

id: 'oss-asset-id',
name: 'sunset.png',
hash: null,
display_name: undefined

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: (non-blocking) ossShape sets hash: null but none of the three new tests exercise getAssetStoredFilename or getAssetUrlFilename, which are the only functions that consume hash. The field is inert here — either add a stored-filename assertion or drop it to avoid implying coverage that is not there.

})

it('honours OSS-emitted display_name when present', () => {
const ossWithDisplayName: AssetItem = {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick: (non-blocking) "honours OSS-emitted display_name when present" exercises the same branch as the existing "falls back to display_name when filename metadata is absent" test at line 365 — identical code path, different fixture string. Per the project parsimony guideline this could be folded into the existing suite or dropped.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cursor-review Trigger multi-model Cursor agent review on this PR size:S This PR changes 10-29 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants